package com.hyl.message.config;

import com.hyl.message.constants.MQConstant;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

/**
 * @author leaf
 * @description TODO
 * @created 2023/7/20
 */
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
@Configuration
public class DirectQueueConfig {

    /**
     * 初始化队列
     * @return
     */
    @Bean
    public Queue directQueue(){
        //参数说明： 队列名称 是否持久化
        return new Queue(MQConstant.QUEUE_NAME,true);
    }

    /**
     * 初始化队列
     * @return
     */
    @Bean
    public Queue simpleQueue(){
        //参数说明： 队列名称 是否持久化
        return new Queue(MQConstant.QUEUE_SIMPLE_NAME,true);
    }


    /**
     * 初始化队列:工作队列
     * @return
     */
    @Bean
    public Queue workQueue(){
        return new Queue(MQConstant.QUEUE_WORK_NAME,true);
    }

    /**
     * 初始化队列:订阅分发
     * @return
     */
    @Bean
    public Queue demoQueue(){
        return new Queue(MQConstant.QUEUE_SUB_DEMO,true);
    }
    /**
     * 初始化队列:订阅分发
     * @return
     */
    @Bean
    public Queue vueQueue(){
        return new Queue(MQConstant.QUEUE_SUB_VUE,true);
    }

    /**
     * 初始化队列:订阅分发
     * @return
     */
    @Bean
    public Queue proQueue(){
        return new Queue(MQConstant.QUEUE_SUB_PRO,true);
    }


    /**
     * 初始化交换机
     * @return
     */
    @Bean
    public DirectExchange TestDirectExchange() {
        //参数说明： 交换机名称 是否持久化 是否自动删除
        return new DirectExchange(MQConstant.EXCHANGE_DIRECT_NAME,true,false);
    }


    /**
     * 初始化交换机
     * @return
     */
    @Bean
    public FanoutExchange TestFanoutExchange() {
        //参数说明： 交换机名称 是否持久化 是否自动删除
        return new FanoutExchange(MQConstant.EXCHANGE_FANOUT_NAME,true,false);
    }

    /**
     * header交换机
     * @return
     */
    @Bean
    public HeadersExchange headersExchange(){
        return new HeadersExchange(MQConstant.EXCHANGE_HEADER_NAME,true,false);
    }


    @Bean
    Binding bindingDirect() {
        return BindingBuilder.bind(directQueue()).to(TestDirectExchange()).with(MQConstant.ROUTING_DIRECT);
    }

    @Bean
    Binding bindingDirectNew() {
        return BindingBuilder.bind(demoQueue()).to(TestDirectExchange()).with(MQConstant.ROUTING_NEQ_DIRECT);
    }

    @Bean
    Binding bindingFanout1() {
        return BindingBuilder.bind(demoQueue()).to(TestFanoutExchange());
    }

    @Bean
    Binding bindingFanout2() {
        return BindingBuilder.bind(proQueue()).to(TestFanoutExchange());
    }

    @Bean
    Binding bindingFanout3() {
        return BindingBuilder.bind(vueQueue()).to(TestFanoutExchange());
    }

    /**
     * header头路由模式绑定：
     * where(String key) 只需要匹配一个headerKey
     * whereAny(String... headerKeys)  只需要匹配一个headerKey
     * whereAny(Map<String, Object> headerValues) 只需要匹配一个headerKey和headerValue
     * whereAll(String... headerKeys) 需要匹配所有的headerKey
     * whereAll(String... headerKeys) 需要匹配所有的headerKey
     * whereAll(Map<String, Object> headerValues) 需要匹配所有的headerKey和headerValue
     * @return
     */
    @Bean
    Binding bindingHeader() {
        return BindingBuilder.bind(demoQueue()).to(headersExchange()).whereAll("department","role").exist();
    }

}
